package cn.edu.zsc.rbac.view;

import cn.edu.zsc.rbac.domain.vo.BaseVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.service.IBaseService;

abstract class BaseView<Vo extends BaseVo, IService extends IBaseService> {
    IService service;
    Vo[] cache;
    /**
     * 使⽤ System.out 输出红⾊错误信息。
     * <p>
     * 该⽅法使⽤ ANSI 转义码来在控制台中输出红⾊的错误信息。
     * </p>
     *
     * @param message 错误信息
     */
    void printError(String message) {
        // ANSI 转义码，\033[31m表示红⾊，\033[0m表示重置为默认颜⾊
        System.out.println("\033[31m" + message + "\033[0m");
    }
    /**
            * 根据⽤户输⼊的ID，从缓存中获取相应的数据。
            * 如果缓存为空，会通过服务层查询所有数据并缓存。
            *
            * <p>该⽅法会提示⽤户输⼊ID，验证输⼊的合法性，
            * 如果输⼊有效且ID对应的数据存在，则返回该数据的视图对象；
            * 如果输⼊⽆效或者未找到数据，则会返回null。</p>
            *
            * @return 返回找到的视图对象，如果没有找到或输⼊⽆效，则返回null。
            */
    public Vo getCacheById() {
        // 提示⽤户输⼊数据ID
        System.out.print("请输⼊ID，ID必须是⼤于0的整数：");
        // 验证⽤户输⼊的ID是否为整数
        if (!MainView.input.hasNextInt()) {
            // 清除⽆效输⼊
            MainView.input.nextLine();
            printError("ID必须为整数，请输⼊整数值");
            return null;
        }
        // 获取⽤户输⼊的ID
        int id = MainView.input.nextInt();
        // 清除输⼊缓存中的换⾏符
        MainView.input.nextLine();
        // 验证ID是否⼤于0
        if (id < 1) {
            System.out.println("ID必须⼤于0，请重新输⼊");
            return null;
        }
        // 如果缓存为空，则从服务层查询所有数据并缓存
        if (cache == null) {
            // 调⽤服务层获取数据列表
            Result result = service.list();
            // 将查询到的数据数据缓存
            cache = (Vo[]) result.data;
        }
        // 在缓存中查找指定ID的视图对象
        Vo vo = null;
        for (Vo item : cache) {
            if (item.id == id) {
                // 找到对应ID的视图对象，输出视图对象信息
                System.out.println("该ID对应的数据是：");
                System.out.println(item);
                vo = item;
                break;
            }
        }
        // 如果未找到数据，则提示⽤户
        if (vo == null) {
            printError("当前没有该ID对应的数据");
            return null;
        }
        return vo;
    }
}
